import greenfoot.*;  // (World, Actor, GreenfootImage, Greenfoot and MouseInfo)

/**
 * Write a description of class Globito here.
 * 
 * @author Montes Alonso Irli Natali
 * @version Programacion Orientada a Objetos
 */
public  class Globito extends ObjetoSube
{
    private boolean encuentraObstaculo;//bandera para ver si se encuentra algun obstaculo
    private Patricio patricio;//variable de tipo patricio
    private int contador;//variable que heredan todos los globos guarda guarda la dureza de cada globo

    /**
     * constructor de Globito
     * @param patri hace referencia a Patricio
     */
    public Globito(Patricio patri, int resistencia)
    {
        encuentraObstaculo=false;
        subir(1);
        patricio=patri;
        contador=resistencia;
        cambiaImagenGlobo();
    }

    /**
     * Metodo que recibe como parametro unContador y se le asigna a la variable de instancia contador
     * @param unContador, sera asignado a la variable contador
     */
    public void contador(int unContador)
    {
        contador=unContador;
    }

    /**
     * metodo donde se hacen comparaciones para poder logar que los globos se detengan, se muevan hacia arriba,
     * checa si llego hasta arriba para pasar de nivel siempre y cuando no encuentre algun obstaculo que se lo
     * impida.
     */
    public void act() 
    {
        if(this.seEncuentraGlobo())
        {
            subir(0);    
            patricio.detenPatricio();
            encuentraObstaculo=true;
        }
        else
        {
            subir(1);
            if(getY()>10)
                patricio.sigueSubiendoPat();
        } 
        if(! encuentraLindoNopal() && !meEncontreUnGloboLoPoncho() && !encuentraMaderita())
        {
            if(mueve(subir())==10)//compara si la posicion del globo llego hasta arriba
            {
                subir(0);    
                patricio.detenPatricio();
                ((Fondo)this.getWorld()).cambiaJuego();
                encuentraObstaculo=true;//si se cumple detiene el juego
            }
        }
        cambiaImagenGlobo();
    }

    /**
     * Metodo que mueve el globo hacia arriba
     * @param sub numero de coordenadas en Y que subira el globo
     */
    public int mueve(int sub)
    {
        int sube=sub;//cantidad de movimientos que dara hacia arriba
        if(!encuentraObstaculo)
        {
            if(super.getY()>0)//mientras la posicion del globo en Y sea mayor que 0
            {
                sube=(getY()-sube);// sube se iguala al valor de la posicion en Y - los pasos que se quieren dar
                this.setLocation(getX(),sube);//se pone el globo en la posicion de X y Y deseada
            }
        }
        return sube;// se regresa sube que es donde se encuentra la posicion que se elevo el globo
    }

    /**
     * Metodo que detecta si el globo encontro a un portador
     * @return true si alguna Caja toca al globo
     * @return false si no es tocado por alguna Caja
     */
    public boolean seEncuentraGlobo()
    {
        Actor caja=super.getOneIntersectingObject(Cajas.class);

        if(caja != null)
            encuentraObstaculo=true;
        else
            encuentraObstaculo=false;

        return encuentraObstaculo;
    }

    /**
     * metodo que detecta si el globo encontro un nopal, si lo encontro se elimina un globo.
     * @return true si un Cactus toca al globo
     * @return false si no es tocado por un Cactus
     */
    public boolean encuentraLindoNopal()
    {
        Actor nopalito=super.getOneIntersectingObject(Cactus.class);
        World mundo;
        mundo=super.getWorld();
        if(nopalito != null)
        {
            contador--;
            if(contador==0)
            {
                this.patricio.eliminaleGlobo(this);
                mundo.removeObject(this);
                Greenfoot.playSound("globo.wav");
            }
            mundo.removeObject(nopalito);
            return true;
        }
        return false;  
    }

    /**
     * metodo que regresa true si encontro una madera y se reinicia la posicion de los globos
     * si regresa false quiere decir que no ah encontrado nada
     * @return true si una Maderota toca al globo
     * @return false si no es tocado por una Maderota
     */
    public boolean encuentraMaderita()
    {
        Actor madera=super.getOneIntersectingObject(Maderota.class);
        World mundo;
        mundo=super.getWorld();
        if(madera != null)
        {
            reiniciaPosicion();
            return true;
        }
        return false;  
    }

    /**
     * metodo que checa si los globos encuentran una espina, si es asi se revienta y se decrementa el contador
     * para ver las vidas de cada globo
     * @return true si una Espina toca al globo
     * @return false si no es tocado por una Espina
     */
    public boolean meEncontreUnGloboLoPoncho()
    {
        Actor espinita=super.getOneIntersectingObject(Espina.class);

        World mundo;
        mundo=super.getWorld();

        if(espinita != null)
        {
            contador--;
            if(contador==0)
            {
                this.patricio.eliminaleGlobo(this);
                mundo.removeObject(this);
                Greenfoot.playSound("globo.wav");
            }
            mundo.removeObject(espinita);
            return true;
        }

        return false; 
    }

    /**
     * metodo para reinicir la posicion tanto de los globos como de patricio
     */
    public void reiniciaPosicion()
    {
        World mundo;
        mundo=super.getWorld();

        java.util.List listaPatricio=mundo.getObjects(Patricio.class);
        if(!listaPatricio.isEmpty())
        {
            Object obj= listaPatricio.get(0);
            Actor patricio=(Actor)obj;
            patricio.setLocation(334, 342);
        }

        java.util.List listaGlobo=mundo.getObjects(Globito.class);
        if(!listaGlobo.isEmpty())
        {

            Object obj= listaGlobo.get(0);
            Actor globo1=(Actor)obj;
            globo1.setLocation(366, 289);
            ((Globito)globo1).contador--;
            if(((Globito)globo1).contador==0)
            {
                this.patricio.eliminaleGlobo((Globito)globo1);
                mundo.removeObject(globo1);
                Greenfoot.playSound("globo.wav");
            }

            if(listaGlobo.size()==2)
            {
                Object obj1= listaGlobo.get(1);
                Actor globo2=(Actor)obj1;
                globo2.setLocation(314, 289);
                ((Globito)globo2).contador--;
                if(((Globito)globo2).contador==0)
                {
                    this.patricio.eliminaleGlobo((Globito)globo2);
                    mundo.removeObject(globo2);
                    Greenfoot.playSound("globo.wav");
                }
            }
        }
    }

    /**
     * Metodo que permite cambiar de imagen para el globo dependiendo de la dureza de cada globo y de
     * cuantas veces ha sido tocado
     */
    public void cambiaImagenGlobo()
    {
        if(contador==1)
            this.setImage("globo.png");
        else
        if(contador>=2&&contador<4)
            this.setImage("globod.png");
        else
        if(contador>=4)
            this.setImage("globom.png");
    }
}